package com.cdeledu.thread4.c19;

public interface FutureService<IN, OUT> {

	/**提交不需要返回值的任务，Future.get方法返回的将会是null
	 * @param runnable
	 * @return
	 */
	Future<?> submit(Runnable runnable);

	/**提交需要返回值的任务，其中Task接口代替了Runnable接口
	 * @param task
	 * @param input
	 * @return
	 */
	Future<OUT> submit(Task<IN, OUT> task, IN input);

	/**使用静态方法创建一个FutureService的实现
	 * @return
	 */
	static <T, R> FutureService<T, R> newService() {
		return new FutureServiceImpl<>();
	}

	/**增加回调接口Callback，当任务执行结束之后，Callback会得到执行
	 * @param task
	 * @param input
	 * @param callback
	 * @return
	 */
	Future<OUT> submit(Task<IN, OUT> task, IN input, Callback<OUT> callback);

}